7112
4297
Deze vraag heeft hier al antwoorden:
Geen impliciete conversie bij overbelaste operator
(2 antwoorden)
7 jaar geleden gesloten.
Ik schrijf een eenvoudige wrapper voor een elementair type en probeer te voorkomen dat ik te veel smaken van standaardoperatoren moet schrijven. Ik hoopte dat impliciete typeconversie zou helpen, maar dat doet het niet. Hier is een uitgekleed voorbeeld:
struct Int
​
int _i;
Int (int i = 0): _i {i} {}
Int operator + (const Int & rhs) {return _i + rhs._i;}
​
int main (int argc, char * argv [])
​
(ongeldig) (Int (1) + 2); // Fijn
(ongeldig) (2 + Int (1)); // error: ongeldige operanden naar binaire expressie ('int' en 'Int')
​
Ik gebruik llvm. De eerste regel van de belangrijkste compileert prima. De tweede veroorzaakt een fout. Wat ik had gehoopt dat er op de tweede regel zou gebeuren, is dat 2 impliciet zou worden geconverteerd naar Int (2), gevolgd door een oproep naar operator +. Waarom gebeurt dat niet? Waarom vindt de impliciete conversie plaats in de eerste regel? 
Het gebeurt in de eerste regel omdat de enige beschikbare operator + operator + (Int &) is (die een impliciete eerste parameter van Int heeft voor deze instantie). De tweede regel mislukt omdat de eerste parameter een int is en hij heeft geen idee dat hij deze moet converteren voordat hij de bewerking probeert (hij weet niet dat hij Int :: operator + moet gebruiken).
U kunt dat probleem vermijden door van de operator een vriend te maken die geen lid is (http://ideone.com/YCf7wX)
struct Int
​
int _i;
Int (int i = 0): _i {i} {}
vriend Int operator + (const Int & lhs, const Int & rhs);
​
Int operator + (const Int & lhs, const Int & rhs)
​
retourneer lhs._i + rhs._i;
​
int belangrijkste ()
​
Int i;
ik + 5;
5 + i;
retourneer 0;
​
​
Niet het antwoord waar je naar zoekt? Blader door andere vragen met de tag c ++ operator-trefwoord impliciete conversie of stel uw eigen vraag.